

package controladores;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

import vistas.VOrden;
import modelos.Caretaker;
import modelos.MOrden;
import modelos.MProducto;


public class COrden implements ActionListener{

    private vistas.VOrden vista;
    private modelos.MOrden modelo;
    private ArrayList<MProducto> productos;
    private Caretaker caretaker = new Caretaker();
   
    
    //Patron singleton instancia unica
    
    private static COrden instancia;

	public static synchronized COrden getInstancia() {
		if (instancia == null)
			instancia = new COrden();
		return instancia;
    
	}
    public COrden() {
    	super();
        this.vista= new VOrden(this);
        modelo= new modelos.MOrden();
        productos= new MProducto().listarProductos();
        cargarDescripciones();
        vista.addListener(this);
    }
    
    public void mostrar() {
        vista.setVisible(true);
    }

    public void cargarDescripciones(){
        Vector<String> descripciones = new Vector<String>();
        for (int i = 0; i < productos.size(); i++)
            descripciones.add(productos.get(i).getDescripcion());
        vista.cargarComboProductos(descripciones);
    }

     public MProducto buscarProducto(String descrpicion){
        for (int i = 0; i < productos.size(); i++)
            if(productos.get(i).getDescripcion().equals(descrpicion))
                return productos.get(i);
        return null;
    }

     public void actionPerformed(ActionEvent ae) {
         if(ae.getActionCommand().equals("Registrar")){
                registrar();

        }
        else if(ae.getActionCommand().equals("Salir")){
            vista.setVisible(false);
            vista.reiniciar();
        }
        else if(ae.getActionCommand().equals("Agregar")){
            if(validarCantidad())
                vista.agregarFila(vista.getRegistro());
        }
        else if(ae.getActionCommand().equals("Quitar")){
            vista.quitar();
        }
        else if (ae.getActionCommand().equals("Deshacer")){
        	Deshacer();
        }
        else{
            vista.reiniciar();
        }
    }
     
     // Bonton deshacer del patron memento (recuerdo)
     public void Deshacer()
     {
    	 if (caretaker.getUltimo() == -1)
    		 JOptionPane.showMessageDialog(new JFrame(), "No hay Salvados", "No se puede Deshacer", JOptionPane.INFORMATION_MESSAGE);
    	 else
    		 
    	 {
    		 MOrden.restaurarMemento(caretaker.getMemento(caretaker.getUltimo()));
    		 vista.setCodigo(MOrden.getCodigo());
    		 vista.setNombre(MOrden.getNombre());
    		 vista.setTotal(MOrden.getTotal());
    
    	}
    	 
     }
     
     public boolean validarCamposVacios(ArrayList<JTextField> a){
        for (JTextField texto : a) {
            if(texto.getText().equals("")){
                JOptionPane.showMessageDialog(new JFrame(),"Campos vacios","Guaro Burguer",JOptionPane.INFORMATION_MESSAGE);
                return false;
            }
        }
        return true;
    }

   public boolean validarCantidad(){
        if(vista.getCantidad()<=0){
                JOptionPane.showMessageDialog(new JFrame(),"Cantidad no permitida","Guaro Burguer",JOptionPane.INFORMATION_MESSAGE);
                return false;
            }

        return true;
    }  


    private void registrar() {
        if(validarCamposVacios(vista.getTextos())){
            modelo.setCodigo(vista.getTxtCodigo().getText());
            modelo.setNombre(vista.getTxtNombre().getText());
            modelo.setTotal(Float.parseFloat(vista.getTxtTotal().getText()));
            modelo.setStatus("A");
            modelo.registrar();
                ArrayList<String> c = new ArrayList<String>();
                ArrayList<Integer> p = new ArrayList<Integer>();
                ArrayList<String []> f= vista.getInfoTabla();
                for (String[] s : f) {;
                    c.add(buscarProducto(s[0]).getCodigo());
                    p.add(Integer.parseInt(s[1]));
                }
                MOrden morden = new MOrden (vista.getTxtCodigo().getText(), vista.getTxtNombre().getText(), Float.parseFloat(vista.getTxtTotal().getText()));
                caretaker.anadirMemento(morden.saveMemento());
                modelo.registrarProductos(c, p);
                for (String s : c) {
                    modelos.MProducto m = new modelos.MProducto();
                    m.setCodigo(s);
                    m.actualizarStockIngredientes();
                }
           JOptionPane.showMessageDialog(new JFrame(),"Orden registrada exitosamente","Guaro Burguer",JOptionPane.INFORMATION_MESSAGE);
           vista.reiniciar();
       
       
    
        }
        else
            JOptionPane.showMessageDialog(new JFrame(),"El codigo ya se encuentra registrada","Guaro Burguer",JOptionPane.INFORMATION_MESSAGE);
    }

    private void agregar() {
        ArrayList<String[]> v= vista.getInfoTabla();
        modelos.MProducto producto = buscarProducto(vista.getTextoCmbProducto());
        int n =vista.getCantidad();
        int i = 0;
        while(i < n) {
            if(!producto.stockIngredientes()){
                JOptionPane.showMessageDialog(new JFrame(),"Disculpe no podemos atender su orden","Guaro Burguer",JOptionPane.WARNING_MESSAGE);
                return;
            }
            i++;
        }
        vista.agregarFila(vista.getRegistro());
    }
}
